package cn.bxshey.utilModule;

import cn.bxshey.commonModule.constant.JwtConstant;
import cn.bxshey.commonModule.enums.ResultEnum;
import cn.bxshey.commonModule.exception.BusinessException;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.*;

/**
 * @作者：不想说话而已
 * @Date：2024/3/10 2:15
 */
public class JwtUtil {

    /**
     *
     * @param info 令牌数据信息，有效时间，用户id等
     * @return jwt-token令牌
     */
    public static String createToken(Map<String,Object> info){
        //设置令牌有效时间
        Calendar calendar = Calendar.getInstance();
        if(Objects.nonNull(info.get("tokenTime"))){
            calendar.add(Calendar.DAY_OF_YEAR, Integer.parseInt(String.valueOf(info.get("tokenTime"))));
        }else {
            calendar.add(Calendar.DAY_OF_YEAR,7);
        }

        JWTCreator.Builder builder = JWT.create();
        //添加秘钥，返回生成的token
        return builder.withIssuer(JwtConstant.ISS) //设置发行人
                .withPayload(info) //遍历info集合， 添加其他数据信息
                .withJWTId(UUID.randomUUID().toString()) //jwtID
                .withExpiresAt(calendar.getTime()) //有效时间
                .sign(Algorithm.HMAC256(JwtConstant.SECRET_KEY)); //算法，自定义秘钥

    }

    /**
     * @param token 令牌token字符串
     * @return Map集合，包含部分用户信息
     */
    public static Map<String,Object> parseToken(String token){
        try{
            //设置解密的规则
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(JwtConstant.SECRET_KEY)).build();
            DecodedJWT verify = jwtVerifier.verify(token); //进行token解密
            Map<String,Object> info = new HashMap<>();

            //循环遍历，添加map信息，以此清除两边的双引号
            for (Map.Entry<String, Claim> map : verify.getClaims().entrySet() ) {
                info.put(map.getKey(), map.getValue().asString());
            }
            return info;//返回解密的信息
        }catch (BusinessException e){
            return null;
        }
    }
}
